#include "lexical.h"
#include "error.h"
#include <ctype.h>
#include <string.h>

extern symbol_e token_g;
extern char token_id_g[];   // 存放标识符
extern int token_num_g;
void var(void);
void num(void);
void expression(void);
void other_items(void);
void item(void);


void program(void)
{   
    if(token_g != FILE_END) {
        assign_statement();
        program();
    } 
}

/*
    <赋值语句> -> <变量> '=' <表达式> ';'
*/
void assign_statement(void)
{
    var();
    if(token_g == ASSIGN) {
        get_token();      
    } else {
        syn_err(LOST_ASSIGN, ERROR);
    }
    expression();
    if(token_g == SEMICO) {
        get_token();      
    } else {
        syn_err(LOST_SEMICO, ERROR);
    }
}


/*
    <变量> -> a | b | c
*/
void var(void)
{
    if(token_g == ID) {
        if(strcmp(token_id_g,"a") == 0) {

        } else if (strcmp(token_id_g,"b") == 0) {

        } else if (strcmp(token_id_g,"c") == 0) {

        } else {
            syn_err(UNKNOW_VAR, ERROR);
        }
    } else {
        syn_err(UNKNOW_VAR, ERROR);
    }
    get_token();
}

/*
    <数字> -> 0 | 1 | 2
*/
void num(void)
{
    if(token_g == NUM && (token_num_g == 0 || token_num_g == 1 || token_num_g == 2)) {
        ;
    }else {
        syn_err(UNKNOW_NUM, ERROR);
    }
    get_token();
}

/*
    <表达式> -> <项> <其余项>
*/
void expression(void)
{
    item();
    other_items();
}

/*
    <项> -> <变量> | <数字>
*/
void item(void) 
{
    if(token_g == NUM) {
        num();
    } else {
        var();
    }
}


/*
    <其余项> -> '+' <项> <其余项> | ε   
*/

void other_items(void)
{
    if(token_g == ADD) {
        get_token();
        item();
        other_items();
    } 
}


